using System;
using System.Collections.Generic;
using Server;
using Server.ContextMenus;
using Server.Mobiles;
using Server.Network;

namespace Server.Items
{
	public class FishBowl : BaseContainer
	{
		public override int LabelNumber{ get{ return 1074499; } } // A fish bowl

		[CommandProperty( AccessLevel.GameMaster )]
		public bool Empty
		{
			get{ return ( Items.Count == 0 ); }
		}

		[CommandProperty( AccessLevel.GameMaster )]
		public BaseFish Fish
		{
			get
			{
				if ( Empty )
					return null;

				if ( Items[ 0 ] is BaseFish )
					return (BaseFish) Items[ 0 ];

				return null;
			}
		}

		public override double DefaultWeight { get { return 2.0; } }

		[Constructable]
		public FishBowl() : base( 0x241C )
		{
			Hue = 0x47E;
			MaxItems = 1;
		}

		public FishBowl( Serial serial ) : base( serial )
		{
		}

		public override void OnDoubleClick( Mobile from )
		{
		}

		public override bool TryDropItem( Mobile from, Item dropped, bool sendFullMessage )
		{
			if ( !CheckHold( from, dropped, sendFullMessage, true ) )
				return false;

			DropItem( dropped );
			return true;
		}

		public override bool OnDragDrop( Mobile from, Item dropped )
		{
			if ( !IsAccessibleTo( from ) )
			{
				from.SendLocalizedMessage( 502436 ); // That is not accessible.
				return false;
			}

			if ( !( dropped is BaseFish ) )
			{
				from.SendLocalizedMessage( 1074836 ); // The container can not hold that type of object.
				return false;
			}

			if ( base.OnDragDrop( from, dropped ) )
			{
				((BaseFish) dropped).StopTimer();
				InvalidateProperties();

				return true;
			}

			return false;
		}

		public override bool CheckItemUse( Mobile from, Item item )
		{
			if ( item != this )
				return false;

			return base.CheckItemUse( from, item );
		}

		public override bool CheckLift( Mobile from, Item item, ref LRReason reject )
		{
			if ( item != this )
			{
				reject = LRReason.CannotLift;
				return false;
			}

			return base.CheckLift( from, item, ref reject );
		}

		public override void AddNameProperties( ObjectPropertyList list )
		{
			base.AddNameProperties( list );

			if ( !Empty )
			{
				BaseFish fish = Fish;

				if ( fish != null )
					list.Add( 1074494, "#{0}", fish.LabelNumber ); // Contains: ~1_CREATURE~
			}
		}

		public override void GetContextMenuEntries( Mobile from, List<ContextMenuEntry> list )
		{
			base.GetContextMenuEntries( from, list );

			if ( !Empty && IsAccessibleTo( from ) )
				list.Add( new RemoveCreature( this ) );
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 1 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();

			if ( version == 0 )
				Weight = DefaultWeight;
		}

		private class RemoveCreature : ContextMenuEntry
		{
			private FishBowl m_Bowl;

			public RemoveCreature( FishBowl bowl ) : base( 6242, 3 ) // Remove creature
			{
				m_Bowl = bowl;
			}

			public override void OnClick()
			{
				if ( m_Bowl == null || m_Bowl.Deleted || !m_Bowl.IsAccessibleTo( Owner.From ) )
					return;

				BaseFish fish = m_Bowl.Fish;

				if ( fish != null )
				{
					if ( fish.IsLockedDown ) // for legacy fish bowls
					{
						Owner.From.SendLocalizedMessage( 1010449 ); // You may not use this object while it is locked down.
					}
					else if ( !Owner.From.PlaceInBackpack( fish ) )
					{
						Owner.From.SendLocalizedMessage( 1074496 ); // There is no room in your pack for the creature.
					}
					else
					{
						Owner.From.SendLocalizedMessage( 1074495 ); // The creature has been removed from the fish bowl.
						fish.StartTimer();
						m_Bowl.InvalidateProperties();
					}
				}
			}
		}
	}
}
